'use strict';
// 引入 vk-unicloud
const vkCloud = require('vk-unicloud');
// 通过 vkCloud.createInstance 创建 vk 实例
const vk = vkCloud.createInstance({
	baseDir: __dirname,
	requireFn: require
});
var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符

module.exports = async (event, context) => {
	/**
	 * 定时器 - 自动将未付款的订单取消，同时自动删除7天之前的已取消订单和未付款订单
	 * 运行时间：每天0点0分运行
	 * 0 0 0 * * * *
	 */
	let res = { code: 0, msg: "" };
	// 获取7天前0点的时间
	let { todayStart } = vk.pubfn.getCommonTime();
	let time = vk.pubfn.getOffsetTime(todayStart, {
		day: 7,
		mode: "before", // after 之后 before 之前
	});
	let nowTime = Date.now();
	console.log('本次定时器类型: ', "自动删除7天前的已取消或未付款的订单");
	console.log('本次定时器执行时间: ', vk.pubfn.timeFormat(nowTime));

	// 特别注意，通过此方式删除的订单，如果用了优惠券，优惠券不会返还。库存也不会增加。
	// 特别注意，通过此方式删除的订单，如果用了优惠券，优惠券不会返还。库存也不会增加。
	// 特别注意，通过此方式删除的订单，如果用了优惠券，优惠券不会返还。库存也不会增加。

	let dbName = "vk-mall-order";
	console.log(`正在取消已过期的订单`);
	let timeline = { time: nowTime, msg: "系统取消订单", type: "cancel", oper_type: "system", oper_uid: "system" };
	res.num1 = await vk.baseDao.update({
		dbName,
		whereJson: {
			status: 0, // 未付款的订单
			auto_cancel_time: _.lte(nowTime), // 已经过期
			"amount_info.used_balance_amount": 0, // 当用户使用余额进行部分付款，则不直接取消
			"amount_info.used_integral": _.or(_.exists(false), _.eq(0)), // 当用户使用积分抵扣过，则不直接取消
		},
		dataJson: {
			status: -1,
			cancel_time: nowTime,
			timeline: _.push(timeline)
		}
	});
	console.log(`正在删除【${vk.pubfn.timeFormat(time)}】之前的已取消的订单`);
	res.num2 = await vk.baseDao.del({
		dbName,
		whereJson: {
			status: -1, // 只删除7天前的已取消订单
			_add_time: _.lt(time)
		}
	});
	// 查找已过期的订单（且用了余额或积分的）
	let orderList = await vk.baseDao.select({
		dbName,
		getCount: false,
		getMain: true,
		pageIndex: 1,
		pageSize: 1000,
		whereJson: _.and([{
				status: 0, // 只删除7天前的已取消或未付款的订单
				auto_cancel_time: _.lte(nowTime), // 已经过期
			},
			// 使用了余额或积分的的
			_.or([{
					"amount_info.used_balance_amount": _.gt(0),
				},
				{
					"amount_info.used_integral": _.gt(0),
				}
			])
		])
	});
	if (vk.pubfn.isNotNull(orderList)) {
		// 循环执行取消订单操作
		for (let i = 0; i < orderList.length; i++) {
			let item = orderList[i];
			let callRes = await vk.callFunction({
				name: "router",
				url: 'client/order.pub_cancel',
				data: {
					order_no: item.order_no,
					pwd: "%……&*#@！%￥）（*{}”“|”L》》《"
				}
			});
			console.log(item.order_no, 'callRes: ', callRes)
			if (callRes.code === 0) {
				res.num1++;
			}
		}
	}
	let logContent = `成功取消${res.num1}个未付款的订单;成功删除${res.num2}个已取消订单`;
	console.log('logContent: ', logContent)
	// 写入系统日志
	// 获取当前请求id（只有云端云函数才有）
	let request_id = vk.pubfn.getUniCloudRequestId();
	console.log("request_id", request_id)

	// 此处没有必要添加日志，故将其注释掉
	// await vk.baseDao.add({
	// 	dbName: "opendb-admin-log",
	// 	dataJson: {
	// 		user_id: "system",
	// 		user_name: "系统",
	// 		title: "定时任务，取消超时未支付订单，删除7天前的已取消订单",
	// 		content: logContent,
	// 		ip: context.CLIENTIP,
	// 		url: "",
	// 		request_param: {},
	// 		response: res,
	// 		request_id
	// 	}
	// });
	return res;
};
